import pako from 'pako'
import { EventBus } from "@/utils/event-bus"

const websocket = {
	state: {
		socketTask: null,
        ch:{},
		is_open_socket: false
	},

	mutations: {
		WEBSOCKET_INIT(state, url) {
			// 创建一个this.socketTask对象【发送、接收、关闭socket都由这个对象操作】
			console.log('websocket 连接 url: ' + url)
			state.socketTask = new WebSocket('wss://www.huobi.ge/-/s/pro/ws')
			console.log(state.socketTask)
			// 查看当前连接是否已经准备好发送和接受数据
			state.socketTask.onopen = (res) => {
				console.log("WebSocket已经准备好发送和接受数据！");
				state.is_open_socket = true;
        // 回调方法
        EventBus.$emit('goSend')
				// 注：只有连接正常打开中 ，才能正常收到消息
			}
			//接收消息
			state.socketTask.onmessage = (res) => {
				// console.log("收到服务器内容：", res);
				// 这里返回的数据res.data是Gzip压缩包，所以需要通过FileReader和pako解压
				// 如果不是Blob对象可跳过FileReader和pako解压
				// Blob对象只是二进制数据的容器， 本身并不能操作二进制， FileReader对象就是专门操作二进制数据的
				// FileReader主要用于将文件内容读入内存， 通过一系列异步接口， 可以在主线程中访问本地文件。
				let reader = new FileReader()
				// 当读取操作成功完成时调用
				reader.onload = function (e) {
					// 对数据进行解压 result为解压后res.data的数据
					let result = JSON.parse(pako.ungzip(reader.result, {
						to: 'string'
					}))
					// console.log(result, "res.data Gzip解压完成")

					// 以下是业务判断
					if (result.ping) {
						let data = {
							pong: result.ping
						}
						state.socketTask.send(JSON.stringify(data));
						return
					}
					if (result && result.ch) {
						EventBus.$emit(result.ch,{data: result})
            state.ch[result.ch] = result
					}
				}
				// //将返回的数据解析为字符串格式 异步按字节读取文件内容，结果用ArrayBuffer对象表示
				reader.readAsArrayBuffer(res.data);
			};
      //  报错事件 
      state.socketTask.onerror = err => {
        console.log(err, 'depth-socket::error')
      }
      // 断线事件
      state.socketTask.onclose = () =>{
        state.is_open_socket = false;
        // console.log('断线重连')
        this.commit('WEBSOCKET_INIT')

        // 通过emit告诉页面断开连接
        EventBus.$emit('stopSocket')
      }
		},
		// 发送消息
		WEBSOCKET_SEND(state, p) {
			console.log("ws发送消息:", p);
			state.socketTask.send(p)
		},
	},

	actions: {
		WEBSOCKET_INIT({
			commit
		}, url) {
			commit('WEBSOCKET_INIT', url)
		},
		WEBSOCKET_SEND({
			commit
		}, p) {
			commit('WEBSOCKET_SEND', p)
		}
	}
}

export default websocket